/*
 * @Author: liu
 * @Date: 2024-04-19 23:23:26
 * @LastEditors: liu
 * @LastEditTime: 2024-04-22 01:15:05
 * @FilePath: \yyx_ser_ts\app\index.ts
 * @Description:
 * 天道酬勤
 */
import dotenv from 'dotenv'
//// 读取.env文件并将其挂在到process.env中，这样我们就可以通过process.env读取值了
dotenv.config()

//导入Koa
import Koa, { Context } from 'koa'
//导入传统路由模块
//import useRoutes from './router/standard-router'

// 引入装饰器路由文件，使装饰器运行
import '../app/router/decorator-router'
//引入路由实例
import router from './router/routerInstance'

import koaBody, { HttpMethodEnum } from 'koa-body'

import { Server } from 'http'

//加载日志中间件
import log4 from './logger/demo'

//导入全局异常处理
import catchError from './exception/exception'

//导入Redis
import redis from './db/redis'

//导入sequelize
import db from './db'

db()
const app = new Koa()

//使用全局异常，在其他use之前
app.use(catchError)

//使用koa-body
app.use(
  koaBody({
    multipart: true,
    formidable: {
      //   //在配置选项option，不推荐使用相对路径
      //   //在option里的相对路径不是，不是相对的当前文件，相对process.cwd()
      //   //如果想要使用相对路径，则要写成'./src/upload'，推荐使用绝对路径
      //   uploadDir: path.join(__dirname, '../upload'),
      //   //保持后缀名
      keepExtensions: true
    },

    // 可以给parsedMethods传想要koa-body解析的方法
    parsedMethods: [
      HttpMethodEnum.POST,
      HttpMethodEnum.GET,
      HttpMethodEnum.DELETE,
      HttpMethodEnum.PUT,
      HttpMethodEnum.PATCH
    ]
  })
)

//加载所有中间件的路由规则
app.use(log4())
app.use(router.routes())

//useRoutes(app)

// 将 Redis 实例挂载到上下文（可选）
app.context.redis = redis

// redis示例路由：存储和读取数据
router.get('/test', async (ctx: Context) => {
  try {
    // 写入 Redis
    await ctx.redis.set('key', 'Hello Redis')

    // 读取 Redis
    const value = await ctx.redis.get('key')

    ctx.body = {
      data: value
    }
  } catch (error) {
    // 捕获异常并返回错误信息
    ctx.status = 500
    ctx.body = {
      error: 'Internal Server Error',
      message: (error as Error).message
    }
  }
})

//如果
app.on('error', (err, ctx) => {
  console.log(err, '11111')
})

//开启服务
const run = (port: any): Server => {
  return app.listen(port, () => {
    console.log(`serve is running on http://127.0.0.1:${port}`)
  })
}

export default run
